/*把一个字符串中的字符重新排列生成新的字符串，返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准*/

/* aab 应该返回 2
 * 因为它总共有6中排列 (aab, aab, aba, aba, baa, baa),
 * 但是只有两个 (aba and aba)没有连续重复的字符
**/

function permAlone(str) {
    //创建正则
    var regex = /(.)\1+/g;
    // 转化数组
    var arr = str.split('');
    var permutations = [];
    var tmp;
    //全部相等时返回0，否则再判断没意义。
    if (str.match(regex) !== null && str.match(regex)[0] === str) return 0;
    // 创建一个swap函数来交换变量的内容。
    function swap(index1, index2) {
        tmp = arr[index1];
        arr[index1]=arr[index2];
        arr[index2]=tmp;
    }//简单地说是：ab，ba
    //使用该函数算法生成数组排列。
    function generate(int) {
        if(int === 1){//如果数组内只有一个数据，换言之只有单个字母，直接返回原数组。
            //确保加入我们创建的字符排列是个数组
            permutations.push(arr.join(''));
        }else{
            for (var i=0; i<int;i++){
                generate(int-1);//自身调用，简而言之就是把后边自身的全排列好。
                swap(int % 2? 0 : i, int - 1);//偶数取0，否则取i
            }
        }
    }
    generate(arr.length);
    //过滤重复排列的数组。
    var filtered = permutations.filter(function(string) {
        return !string.match(regex);
    });
    //统计变量
    return filtered.length;
}
permAlone('abfdefa');
